/**
 * @fileoverview The code size benchmark of apps JSPB for proto3 all types
 */
goog.module('protobuf.benchmark.code_size.apps_jspb.AllTypesProto3');

// const ForeignEnum = goog.require('proto.proto3_unittest.ForeignEnum');
const ForeignMessage = goog.require('proto.proto3_unittest.ForeignMessage');
const TestAllTypes = goog.require('proto.proto3_unittest.TestAllTypes');
const TestPackedTypes = goog.require('proto.proto3_unittest.TestPackedTypes');
const {ensureCommonBaseLine} = goog.require('protobuf.benchmark.codeSize.codeSizeBase');

ensureCommonBaseLine();

/**
 * The testing scenario is the same as kernel one.
 * We have
 *  1) add element to repeated fields
 *  2) add element list to repeated fields
 *  3) set fields
 *  4) set repeated fields element
 *  5) get fields
 *  6) get repeated fields element
 *  7) get repeated fields length
 * @return {string}
 */
function accessAllTypes() {
    const msgAllTypes = TestAllTypes.deserialize('');
    const msgPackedTypes = TestPackedTypes.deserialize('');

    msgPackedTypes.addPackedBool(true);
    [true].forEach((e) => msgPackedTypes.addPackedBool(e));
    msgAllTypes.addRepeatedBool(true, 1);
    [true].forEach((e) => msgAllTypes.addRepeatedBool(e));
    msgAllTypes.addRepeatedBytes('1', 1);
    ['1'].forEach((e) => msgAllTypes.addRepeatedBytes(e));
    msgPackedTypes.addPackedDouble(1.0);
    [1.0].forEach((e) => msgPackedTypes.addPackedDouble(e));
    msgAllTypes.addRepeatedDouble(1.0, 1);
    [1.0].forEach((e) => msgAllTypes.addRepeatedDouble(e));
    msgPackedTypes.addPackedFixed32(1, 1);
    [1].forEach((e) => msgPackedTypes.addPackedFixed32(e));
    msgAllTypes.addRepeatedFixed32(1, 1);
    [1].forEach((e) => msgAllTypes.addRepeatedFixed32(e));
    msgPackedTypes.addPackedFixed64(1, 1);
    [1].forEach((e) => msgPackedTypes.addPackedFixed64(e));
    msgAllTypes.addRepeatedFixed64(1, 1);
    [1].forEach((e) => msgAllTypes.addRepeatedFixed64(e));
    msgPackedTypes.addPackedFloat(1.0, 1);
    [1.0].forEach((e) => msgPackedTypes.addPackedFloat(e));
    msgAllTypes.addRepeatedFloat(1.0, 1);
    [1.0].forEach((e) => msgAllTypes.addRepeatedFloat(e));
    msgPackedTypes.addPackedInt32(1, 1);
    [1].forEach((e) => msgPackedTypes.addPackedInt32(e));
    msgAllTypes.addRepeatedInt32(1, 1);
    [1].forEach((e) => msgAllTypes.addRepeatedInt32(e));
    msgPackedTypes.addPackedInt64(1, 1);
    [1].forEach((e) => msgPackedTypes.addPackedInt64(e));
    msgAllTypes.addRepeatedInt64(1, 1);
    [1].forEach((e) => msgAllTypes.addRepeatedInt64(e));
    // msgPackedTypes.addPackedEnum(ForeignEnum.FOREIGN_BAR);
    // [ForeignEnum.FOREIGN_BAR].forEach((e) => msgPackedTypes.addPackedEnum(e));
    // msgAllTypes.addRepeatedForeignEnum(ForeignEnum.FOREIGN_BAR);
    // [ForeignEnum.FOREIGN_BAR].forEach(
    //     (e) => msgAllTypes.addRepeatedForeignEnum(e));
    msgAllTypes.addRepeatedForeignMessage(ForeignMessage.deserialize(''), 1);
    [ForeignMessage.deserialize('')].forEach(
        (e) => msgAllTypes.addRepeatedForeignMessage(e));
    msgPackedTypes.addPackedSfixed32(1, 1);
    [1].forEach((e) => msgPackedTypes.addPackedSfixed32(e));
    msgAllTypes.addRepeatedSfixed32(1, 1);
    [1].forEach((e) => msgAllTypes.addRepeatedSfixed32(e));
    msgPackedTypes.addPackedSfixed64(1, 1);
    [1].forEach((e) => msgPackedTypes.addPackedSfixed64(e));
    msgAllTypes.addRepeatedSfixed64(1, 1);
    [1].forEach((e) => msgAllTypes.addRepeatedSfixed64(e));
    msgPackedTypes.addPackedSint32(1, 1);
    [1].forEach((e) => msgPackedTypes.addPackedSint32(e));
    msgAllTypes.addRepeatedSint32(1, 1);
    [1].forEach((e) => msgAllTypes.addRepeatedSint32(e));
    msgPackedTypes.addPackedSint64(1, 1);
    [1].forEach((e) => msgPackedTypes.addPackedSint64(e));
    msgAllTypes.addRepeatedSint64(1, 1);
    [1].forEach((e) => msgAllTypes.addRepeatedSint64(e));
    msgAllTypes.addRepeatedString('', 1);
    [''].forEach((e) => msgAllTypes.addRepeatedString(e));
    msgPackedTypes.addPackedUint32(1, 1);
    [1].forEach((e) => msgPackedTypes.addPackedUint32(e));
    msgAllTypes.addRepeatedUint32(1, 1);
    [1].forEach((e) => msgAllTypes.addRepeatedUint32(e));
    msgPackedTypes.addPackedUint64(1, 1);
    [1].forEach((e) => msgPackedTypes.addPackedUint64(e));
    msgAllTypes.addRepeatedUint64(1, 1);
    [1].forEach((e) => msgAllTypes.addRepeatedUint64(e));

    msgAllTypes.setOptionalBool(true);
    msgAllTypes.setOptionalBytes('');
    msgAllTypes.setOptionalDouble(1.0);
    msgAllTypes.setOptionalFixed32(1);
    msgAllTypes.setOptionalFixed64(1);
    msgAllTypes.setOptionalFloat(1.0);
    msgAllTypes.setOptionalInt32(1);
    msgAllTypes.setOptionalInt64(1);
    // msgAllTypes.setOptionalForeignEnum(ForeignEnum.FOREIGN_BAR);
    msgAllTypes.setOptionalForeignMessage(ForeignMessage.deserialize(''));
    msgAllTypes.setOptionalSfixed32(1);
    msgAllTypes.setOptionalSfixed64(1);
    msgAllTypes.setOptionalSint32(1);
    msgAllTypes.setOptionalSint64(1);
    msgAllTypes.setOptionalString('');
    msgAllTypes.setOptionalUint32(1);
    msgAllTypes.setOptionalUint64(1);
    msgPackedTypes.setPackedBoolList([true]);
    let arrayVal;
    arrayVal = msgPackedTypes.getPackedBoolList();
    arrayVal[0] = true;
    msgPackedTypes.setPackedBoolList(arrayVal);
    msgAllTypes.setRepeatedBoolList([true]);
    arrayVal = msgAllTypes.getRepeatedBoolList();
    arrayVal[0] = true;
    msgAllTypes.setRepeatedBoolList(arrayVal);
    msgAllTypes.setRepeatedBytesList(['']);
    arrayVal = msgAllTypes.getRepeatedBytesList();
    arrayVal[0] = '';
    msgAllTypes.setRepeatedBytesList(arrayVal);
    msgPackedTypes.setPackedDoubleList([1.0]);
    arrayVal = msgPackedTypes.getPackedDoubleList();
    arrayVal[0] = 1.0;
    msgPackedTypes.setPackedDoubleList(arrayVal);
    msgAllTypes.setRepeatedDoubleList([1.0]);
    arrayVal = msgAllTypes.getRepeatedDoubleList();
    arrayVal[0] = 1.0;
    msgAllTypes.setRepeatedDoubleList(arrayVal);
    msgPackedTypes.setPackedFixed32List([1]);
    arrayVal = msgPackedTypes.getPackedFixed32List();
    arrayVal[0] = 1;
    msgPackedTypes.setPackedFixed32List(arrayVal);
    msgAllTypes.setRepeatedFixed32List([1]);
    arrayVal = msgAllTypes.getRepeatedFixed32List();
    arrayVal[0] = 1;
    msgAllTypes.setRepeatedFixed32List(arrayVal);
    msgPackedTypes.setPackedFixed64List([1]);
    arrayVal = msgPackedTypes.getPackedFixed64List();
    arrayVal[0] = 1;
    msgPackedTypes.setPackedFixed64List(arrayVal);
    msgAllTypes.setRepeatedFixed64List([1]);
    arrayVal = msgAllTypes.getRepeatedFixed64List();
    arrayVal[0] = 1;
    msgAllTypes.setRepeatedFixed64List(arrayVal);
    msgPackedTypes.setPackedFloatList([1.0]);
    arrayVal = msgPackedTypes.getPackedFloatList();
    arrayVal[0] = 1.0;
    msgPackedTypes.setPackedFloatList(arrayVal);
    msgAllTypes.setRepeatedFloatList([1.0]);
    arrayVal = msgAllTypes.getRepeatedFloatList();
    arrayVal[0] = 1.0;
    msgAllTypes.setRepeatedFloatList(arrayVal);
    msgPackedTypes.setPackedInt32List([1]);
    arrayVal = msgPackedTypes.getPackedInt32List();
    arrayVal[0] = 1;
    msgPackedTypes.setPackedInt32List(arrayVal);
    msgAllTypes.setRepeatedInt32List([1]);
    arrayVal = msgAllTypes.getRepeatedInt32List();
    arrayVal[0] = 1;
    msgAllTypes.setRepeatedInt32List(arrayVal);
    msgPackedTypes.setPackedInt64List([1]);
    arrayVal = msgPackedTypes.getPackedInt64List();
    arrayVal[0] = 1;
    msgPackedTypes.setPackedInt64List(arrayVal);
    msgAllTypes.setRepeatedInt64List([1]);
    arrayVal = msgAllTypes.getRepeatedInt64List();
    arrayVal[0] = 1;
    msgAllTypes.setRepeatedInt64List(arrayVal);
    // msgPackedTypes.setPackedEnumList([ForeignEnum.FOREIGN_BAR]);
    // arrayVal = msgPackedTypes.getPackedEnumList();
    // arrayVal[0] = ForeignEnum.FOREIGN_BAR;
    // msgPackedTypes.setPackedEnumList(arrayVal);
    // msgAllTypes.setRepeatedForeignEnumList([ForeignEnum.FOREIGN_BAR]);
    // arrayVal = msgAllTypes.getRepeatedForeignEnumList();
    // arrayVal[0] = ForeignEnum.FOREIGN_BAR;
    // msgAllTypes.setRepeatedForeignEnumList(arrayVal);
    msgAllTypes.setRepeatedForeignMessageList([ForeignMessage.deserialize('')]);
    arrayVal = msgAllTypes.getRepeatedForeignMessageList();
    arrayVal[0] = ForeignMessage.deserialize('');
    msgAllTypes.setRepeatedForeignMessageList(arrayVal);
    msgPackedTypes.setPackedSfixed32List([1]);
    arrayVal = msgPackedTypes.getPackedSfixed32List();
    arrayVal[0] = 1;
    msgPackedTypes.setPackedSfixed32List(arrayVal);
    msgAllTypes.setRepeatedSfixed32List([1]);
    arrayVal = msgAllTypes.getRepeatedSfixed32List();
    arrayVal[0] = 1;
    msgAllTypes.setRepeatedSfixed32List(arrayVal);
    msgPackedTypes.setPackedSfixed64List([1]);
    arrayVal = msgPackedTypes.getPackedSfixed64List();
    arrayVal[0] = 1;
    msgPackedTypes.setPackedSfixed64List(arrayVal);
    msgAllTypes.setRepeatedSfixed64List([1]);
    arrayVal = msgAllTypes.getRepeatedSfixed64List();
    arrayVal[0] = 1;
    msgAllTypes.setRepeatedSfixed64List(arrayVal);
    msgPackedTypes.setPackedSint32List([1]);
    arrayVal = msgPackedTypes.getPackedSint32List();
    arrayVal[0] = 1;
    msgPackedTypes.setPackedSint32List(arrayVal);
    msgAllTypes.setRepeatedSint32List([1]);
    arrayVal = msgAllTypes.getRepeatedSint32List();
    arrayVal[0] = 1;
    msgAllTypes.setRepeatedSint32List(arrayVal);
    msgPackedTypes.setPackedSint64List([1]);
    arrayVal = msgPackedTypes.getPackedSint64List();
    arrayVal[0] = 1;
    msgPackedTypes.setPackedSint64List(arrayVal);
    msgAllTypes.setRepeatedSint64List([1]);
    arrayVal = msgAllTypes.getRepeatedSint64List();
    arrayVal[0] = 1;
    msgAllTypes.setRepeatedSint64List(arrayVal);
    msgPackedTypes.setPackedUint32List([1]);
    arrayVal = msgPackedTypes.getPackedUint32List();
    arrayVal[0] = 1;
    msgPackedTypes.setPackedUint32List(arrayVal);
    msgAllTypes.setRepeatedUint32List([1]);
    arrayVal = msgAllTypes.getRepeatedUint32List();
    arrayVal[0] = 1;
    msgAllTypes.setRepeatedUint32List(arrayVal);
    msgPackedTypes.setPackedUint64List([1]);
    arrayVal = msgPackedTypes.getPackedUint64List();
    arrayVal[0] = 1;
    msgPackedTypes.setPackedUint64List(arrayVal);
    msgAllTypes.setRepeatedUint64List([1]);
    arrayVal = msgAllTypes.getRepeatedUint64List();
    arrayVal[0] = 1;
    msgAllTypes.setRepeatedUint64List(arrayVal);

    let s = '';
    s += msgAllTypes.getOptionalBool() || false;
    s += msgAllTypes.getOptionalBytes() || '';
    // s += msgAllTypes.getOptionalBytes_asB64() || "";
    // s += msgAllTypes.getOptionalBytes_asU8() || new Uint8Array([]);
    s += msgAllTypes.getOptionalDouble() || 0.0;
    s += msgAllTypes.getOptionalFixed32() || 0;
    s += msgAllTypes.getOptionalFixed64() || 0;
    s += msgAllTypes.getOptionalFloat() || 0.0;
    s += msgAllTypes.getOptionalInt32() || 0;
    s += msgAllTypes.getOptionalInt64() || 0;
    // s += msgAllTypes.getOptionalForeignEnum() || ForeignEnum.FOREIGN_BAR;
    s += msgAllTypes.getOptionalForeignMessage();
    s += msgAllTypes.getOptionalSfixed32() || 0;
    s += msgAllTypes.getOptionalSfixed64() || 0;
    s += msgAllTypes.getOptionalSint32() || 0;
    s += msgAllTypes.getOptionalSint64() || 0;
    s += msgAllTypes.getOptionalString() || '';
    s += msgAllTypes.getOptionalUint32() || 0;
    s += msgAllTypes.getOptionalUint64() || 0;
    s += msgAllTypes.getRepeatedBoolList();
    s += msgAllTypes.getRepeatedBoolList()[0];
    s += msgAllTypes.getRepeatedBoolList().length;
    s += msgAllTypes.getRepeatedBytesList();
    s += msgAllTypes.getRepeatedBytesList()[0];
    s += msgAllTypes.getRepeatedBytesList().length;
    s += msgAllTypes.getRepeatedBytesList_asB64();
    s += msgAllTypes.getRepeatedBytesList_asU8();
    s += msgAllTypes.getRepeatedDoubleList();
    s += msgAllTypes.getRepeatedDoubleList()[0];
    s += msgAllTypes.getRepeatedDoubleList().length;
    s += msgAllTypes.getRepeatedFixed32List();
    s += msgAllTypes.getRepeatedFixed32List()[0];
    s += msgAllTypes.getRepeatedFixed32List().length;
    s += msgAllTypes.getRepeatedFixed64List();
    s += msgAllTypes.getRepeatedFixed64List()[0];
    s += msgAllTypes.getRepeatedFixed64List().length;
    s += msgAllTypes.getRepeatedFloatList();
    s += msgAllTypes.getRepeatedFloatList()[0];
    s += msgAllTypes.getRepeatedFloatList().length;
    s += msgAllTypes.getRepeatedInt32List();
    s += msgAllTypes.getRepeatedInt32List()[0];
    s += msgAllTypes.getRepeatedInt32List().length;
    s += msgAllTypes.getRepeatedInt64List();
    s += msgAllTypes.getRepeatedInt64List()[0];
    s += msgAllTypes.getRepeatedInt64List().length;
    // s += msgAllTypes.getRepeatedForeignEnumList();
    // s += msgAllTypes.getRepeatedForeignEnumList()[0];
    // s += msgAllTypes.getRepeatedForeignEnumList().length;
    s += msgAllTypes.getRepeatedForeignMessageList();
    s += msgAllTypes.getRepeatedForeignMessageList()[0];
    s += msgAllTypes.getRepeatedForeignMessageList().length;
    s += msgAllTypes.getRepeatedSfixed32List();
    s += msgAllTypes.getRepeatedSfixed32List()[0];
    s += msgAllTypes.getRepeatedSfixed32List().length;
    s += msgAllTypes.getRepeatedSfixed64List();
    s += msgAllTypes.getRepeatedSfixed64List()[0];
    s += msgAllTypes.getRepeatedSfixed64List().length;
    s += msgAllTypes.getRepeatedSint32List();
    s += msgAllTypes.getRepeatedSint32List()[0];
    s += msgAllTypes.getRepeatedSint32List().length;
    s += msgAllTypes.getRepeatedSint64List();
    s += msgAllTypes.getRepeatedSint64List()[0];
    s += msgAllTypes.getRepeatedSint64List().length;
    s += msgAllTypes.getRepeatedStringList();
    s += msgAllTypes.getRepeatedStringList()[0];
    s += msgAllTypes.getRepeatedStringList().length;
    s += msgAllTypes.getRepeatedUint32List();
    s += msgAllTypes.getRepeatedUint32List()[0];
    s += msgAllTypes.getRepeatedUint32List().length;
    s += msgAllTypes.getRepeatedUint64List();
    s += msgAllTypes.getRepeatedUint64List()[0];
    s += msgAllTypes.getRepeatedUint64List().length;

    s += msgAllTypes.serialize();
    s += msgPackedTypes.serialize();

    return s;
}

goog.global['__hiddenTest'] += accessAllTypes();
